// 导入学生模型
import { Student } from "../model/student.js";
// 导入分页函数
import { pagingFn } from "../router/paging.js";
// 导入 Op 方法
import { Op } from "sequelize";
// 导入依赖包
import url from "url";
// 导入时间依赖包
import moment from "moment";

// 创建函数（查询所有学生 或 查询包含指定关键词的学生）
async function students(ctx, next) {
  // 判断当前页面访问路径 是否正确
  if (ctx.url === "/student/") {
    // 重定向回首页
    ctx.redirect(`/student`);
  }

  // 查询的内容
  const query = url.parse(ctx.url, true).query.query;

  // 判断是查询 还是 分页
  if (!query) {
    // 分页逻辑
    // 判断学生是否存在
    const students = await Student.findAll();

    // 校验时间
    students.forEach((student) => {
      // 校验时间格式
      student.dataValues.enrollmentTime = moment(student.dataValues.enrollmentTime).format(
        "YYYY-MM-DD HH:mm:ss"
      );
    });

    // 使用分页函数（返回 分页数组 或 重定向逻辑）
    const pagings = pagingFn(ctx, students);

    // 校验分页的数据
    if (pagings !== "redirect") {
      // 把学生信息进行渲染 然后再响应给浏览器
      ctx.render("students.html", { students: pagings });
    } else {
      // // 重定向回首页
      ctx.redirect(`/student`);
    }
  } else {
    // 查询逻辑
    // 判断学生是否存在
    const querystudents = await Student.findAll({
      // 条件查询
      where: {
        // 模糊查询
        [Op.or]: [
          {
            // 姓名
            studentName: { [Op.like]: `%${query}%` }
          },
          // 年龄
          {
            studentAge: { [Op.like]: `%${query}%` }
          },
          // 班级
          {
            classRoom: { [Op.like]: `%${query}%` }
          },
          // 入学时间
          {
            enrollmentTime: { [Op.like]: `%${query}%` }
          }
        ]
      }

    });

    // 校验时间
    querystudents.forEach((student) => {
      // 校验时间格式
      student.dataValues.enrollmentTime = moment(student.dataValues.enrollmentTime).format(
        "YYYY-MM-DD HH:mm:ss"
      );
    });

    // 判断查询的列表是否有数据
    if (querystudents.length !== 0) {
      // 有数据就渲染 查询的数据
      ctx.render("students.html", { students: querystudents, query });
    } else {
      // 没数据就渲染 查无数据
      ctx.render("students.html", { query });
    }
  }
}

// 创建函数（用 id 查询 一个 学生）
async function studentById(ctx, next) {
  // 获取 ID
  const id = ctx.params.id.replace(":", "");

  // 判断学生是否存在
  const student = await Student.findByPk(id);

  // 判断是否有查询到信息
  if (!student) {
    console.log("未查到学生！");
  } else {
    // 成功状态码
    ctx.status = 200;
    // 拿到学生对象
    const obj = student.dataValues;
    // 校验时间格式
    obj.enrollmentTime = moment(obj.enrollmentTime).format(
      "YYYY-MM-DD HH:mm:ss"
    );
    // 渲染并响应页面给浏览器
    ctx.render("updateStudent.html", { student: obj });
  }
}

// 创建函数（添加 一个 学生）
async function insertStudent(ctx, next) {
  // 拿到要添加的学生对象
  const studentObj = ctx.request.body;

  // 把对象给学生模型 进行新增
  await Student.create(studentObj);

  // 添加成功提示
  ctx.status = 200;
  ctx.body = "学生添加成功";
}

// 创建函数（修改 一个 学生信息）
async function updateStudent(ctx, next) {
  // 获取 ID
  const id = ctx.params.id.replace(":", "");

  // 拿到学生信息
  const studentObj = ctx.request.body;

  // 修改学生信息
  await Student.update(studentObj, { where: { id } });

  // 修改成功提示
  ctx.status = 200;
  ctx.body = "学生修改成功";
}

// 创建函数（删除 一个 学生）
async function deleteStudent(ctx, next) {
  // 获取 ID
  const id = ctx.params.id.replace(":", "");

  // 判断学生是否存在
  const studentExists = await Student.findByPk(id);

  // 如果不存在就控制台提示
  if (!studentExists) {
    ctx.body = "学生不存在";
    // 设置状态码为404表示资源未找到
    ctx.status = 404;
  } else {
    // 删除学生
    await Student.destroy({ where: { id } });

    // 删除成功提示
    ctx.status = 200;
    ctx.body = "学生删除成功";
  }
}

// 暴露 api 函数接口
export const obj = {
  "get /student": students,
  "get /student/:id": studentById,
  "post /student": insertStudent,
  "put /student/:id": updateStudent,
  "delete /student/:id": deleteStudent,
};
